package com.ben.multiple.aop.config;

import lombok.AllArgsConstructor;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.scheduling.annotation.Async;

/**
 * 日志监听
 * 实现的两种方式：
 * 实现接口：ApplicationListener；     方法上注解加  EventListener
 */
@AllArgsConstructor
public class LogListener {
    private static final org.slf4j.Logger LOGGER = org.slf4j.LoggerFactory.getLogger(LogListener.class);
    private final LogResource logResource;

    /**
     * Async：异步执行；在方法上使用，此方法异步执行；在类上使用，类中的所有方法异步执行  需要使用 EnableAsync 注解
     * 必须是 代理实例 才会触发异步
     * 主线程不需要等待监听事件执行完，可直接返回结果，监听事件异步执行，提高系统的响应效率
     *
     * @param event 被监听的事件
     */
    @Async
    @Order
    @EventListener(LogEvent.class)
    public void saveLog(LogEvent event) {
        Log log = (Log) event.getSource();
        LOGGER.info("异步入库");
        logResource.insertLog(log);
    }
}
